package com.omi.iberolactalpreventa;

import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.widget.Toast;

import java.io.*;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class GestionDB extends SQLiteOpenHelper 
{
	private Toast tInfo;
	public Context context;
	private boolean contextoInterno;
	
	public GestionDB(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, 1);
		this.context = context;
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		//Creamos la base de datos y leemos el fichero SQLDB.omi que contiene las tablas:
		try
		{
		BufferedReader reader = new BufferedReader(new FileReader(Environment.getExternalStorageDirectory().getPath()+"/preventa/SQLDB.omi"));

		String line = reader.readLine();
		
		while(line!=null)
		{
			if(!line.equals(""))
			{
			try
			{
			db.execSQL(line);
			}
			catch(Exception ex)
			{
				tInfo = Toast.makeText(context, "Error SQL: "+ex.getMessage(),Toast.LENGTH_SHORT);
				tInfo.show();
			}
			}
			line = reader.readLine();
		}
		
		reader.close();
		}
		catch(Exception e)
		{
			tInfo = Toast.makeText(context, "Error creando la base de datos",Toast.LENGTH_SHORT);
			tInfo.show();
			return;
		}
	}

	
	
	//Al cambiar la version de la db:
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		eliminarDb();
		onCreate(db);
	}

	//IMPORTACION DESDE FICHERO, FORMATO EXPORTADO NAVISION
	public String importarDatos(ProgressDialog dlgProgress)
	{
		String result="";
		int lineas=0;
		
		int errores=0;
		int insertados=0;
		
		//Guardamos los datos de administracion:
		String idSmartphone="";
		String clave="";
		
		Cursor c = ejecutarSelect(new String[]{"PASSWORD","PHONE_ID"}, "CONFIGURACION", "USUARIO=?", new String[]{"ADMIN"});
		
		if(c!=null && c.moveToFirst())
		{
			clave = c.getString(0);
			idSmartphone = c.getString(1);
		}
		
		SQLiteDatabase db = this.getWritableDatabase();
		
		try
		{

		//Borramos todos los datos para volver a cargarlos:
		contextoInterno=true;
		eliminarDb();
		
		File f = new File(Environment.getExternalStorageDirectory().getPath()+"/preventa/datos.txt");
		
		//Printwriter para escribir los errores
		
		
		File errf = new File(Environment.getExternalStorageDirectory().getPath()+"/preventa/errores.txt");
		if (!errf.exists()) {
		     errf.getParentFile().mkdirs();
		     errf.createNewFile();
		}
		PrintWriter errWriter = new PrintWriter(errf);
		//Si no existe el fichero para importar damos error.
		if(!f.exists())
		{
			return "Error, no hay ningun archivo datos.txt para importar";
		}
		
		BufferedReader reader = new BufferedReader(new FileReader(Environment.getExternalStorageDirectory().getPath()+"/preventa/datos.txt"));

		//Contamos el numero de lineas que van a importarse para poner un maximo en el progreso:
		String line = reader.readLine();
		
	
		
		//Evitamos que el movil entre en reposo:
		
		while(line!=null)
		{
			String[] elementos = line.split("\t",-1);
		
			if(!line.equals("") && !elementos[0].equals("DELETE"))
			{
			lineas++;
			}
			
			line = reader.readLine();
		}
		//Lineas contadas, configuramos el progreso:
		dlgProgress.setMax(lineas);

		reader.close();
		
		//Volvemos a leer y comenzamos el proceso:
		reader = new BufferedReader(new FileReader(Environment.getExternalStorageDirectory().getPath()+"/preventa/datos.txt"));

		line = reader.readLine();

		while(line!=null)
		{
			
			if(!line.equals(""))
			{
			//Sacamos cada uno de los datos del fichero y lo formateamos en consulta:
			String[] elementos = line.split("\t",-1);
			
			//Comprobar si es una operaciono simplemente insertamos:
			if(elementos[0].equals("DELETE"))
			{
				String consultaNon="DELETE FROM ";
				//Si es operacion la formamos:
				for(int i=1;i<elementos.length;i++)
				{
					consultaNon += elementos[i]+" ";
				}
				try
				{
				//Una vez completada la lanzamos
				ejecutarNonQuery(consultaNon);
				}
				catch(Exception ex)
				{
					errores++;
					errWriter.println("Error SQL: "+ex.getMessage()+"\r\n");
					errWriter.flush();
					tInfo.show();
					dlgProgress.setProgress(dlgProgress.getProgress()+1);
					errWriter.println(consultaNon+"\r\n");
				}
			}
			else
			{
			String consultaInsert = "INSERT INTO "+elementos[0]+" VALUES(";
			for(int i=1;i<elementos.length;i++)
			{
				consultaInsert +="'"+elementos[i]+"'";
				if(i!=elementos.length-1)
				{
					consultaInsert+=",";
				}
			}

			try
			{
			db.execSQL(consultaInsert+");");
			dlgProgress.setProgress(dlgProgress.getProgress()+1);
			insertados++;
			}
			
			catch(Exception ex)
			{
				//Error de ejecucion de SQL, sumamos el numero de fallos para el log:
				errores++;
				errWriter.println("Error SQL: "+ex.getMessage()+"\r\n");
				dlgProgress.setProgress(dlgProgress.getProgress()+1);
				errWriter.println(consultaInsert+"\r\n");
			}
			}
			}
			line = reader.readLine();
		}
		reader.close();
		errWriter.close();
		}
		catch(Exception e)
		{
			Toast t =Toast.makeText(context, "No se encontro el archivo /preventa/datos.txt",Toast.LENGTH_SHORT);
			t.show();
		}
		finally
		{
			
		if(errores!=0)
		{
			contextoInterno=false;
			result ="Ha habido "+errores+" errores durante la importacion de registros, para conocerlos vea preventa/errores.txt .\n"+insertados+" Registros, han sido importados.";
		}
		else
		{
		db.execSQL("UPDATE CONFIGURACION SET PASSWORD='"+clave+"',PHONE_ID='"+idSmartphone+"' WHERE USUARIO='ADMIN'");
		contextoInterno=false;
		result = "Datos importados correctamente\n"+insertados+" Registros, han sido importados.";
		}
		}
	
		db.close();
		return result;
	} 

	
	//EJECUCION DE CONSULTAS INSERCCION; UPDATE...
	public boolean ejecutarNonQuery(String query)
	{
		SQLiteDatabase db = this.getWritableDatabase();
		try
		{
		db.execSQL(query);
		}
		catch(Exception ex)
		{
			return false;
		}
		return true;
	}
	
	//PARA SELECTS.
	public Cursor ejecutarSelect(String[] campos,String tabla,String where,String[] argsWhere)
	{
		SQLiteDatabase db = this.getReadableDatabase();
		
		//Realizamos la consulta y devolvemos el cursor con los datos.
		try
		{
		return db.query(tabla, campos, where,argsWhere, null, null, null, null);
		}
		catch(Exception ex)
		{
			tInfo = Toast.makeText(context,"Error SQL: "+ ex.getMessage(),Toast.LENGTH_SHORT);
			tInfo.show();
			return null;
		}
	}
	
	//Sobrecarga con OrderBy:
	public Cursor ejecutarSelect(String[] campos,String tabla,String where,String[] argsWhere,String orderBy)
	{
		SQLiteDatabase db = this.getReadableDatabase();
		
		//Realizamos la consulta y devolvemos el cursor con los datos.
		try
		{
		return db.query(tabla, campos, where,argsWhere, null, null, orderBy, null);
		}
		catch(Exception ex)
		{
			tInfo = Toast.makeText(context, "Error SQL: "+ex.getMessage(), Toast.LENGTH_SHORT);
			tInfo.show();
			return null;
		}
	}
	
	public Cursor ejecutarRawQuery(String consulta,String[] where)
	{
		SQLiteDatabase db = this.getReadableDatabase();
		try
		{
		return db.rawQuery(consulta, where);
		}
		catch(Exception ex)
		{
		//	tInfo = Toast.makeText(context, "Error SQL: "+ex.getMessage(), Toast.LENGTH_SHORT);
		//	tInfo.show();
			return null;
		}
	}
	
	public Cursor ejecutarRawQuery(String consulta)
	{
		SQLiteDatabase db = this.getReadableDatabase();
		try
		{
		return db.rawQuery(consulta,null);
		}
		catch(Exception ex)
		{
			tInfo = Toast.makeText(context, "Error SQL: "+ex.getMessage(), Toast.LENGTH_SHORT);
			tInfo.show();
			return null;
		}
	}
	
	public void eliminarDb()
	{
		//Sacamos la lista de tablas:
		Cursor cur = ejecutarSelect(new String[]{"NAME"},"sqlite_master","TYPE=?",new String[]{"table"});
		if(cur!=null && cur.moveToFirst())
		{
			do {
				//Eliminamos cada una de las tablas:
				ejecutarNonQuery("DROP TABLE "+cur.getString(0));
            } while (cur.moveToNext());
			onCreate(this.getWritableDatabase());
		}
		
		if(!contextoInterno)
		{
			tInfo = Toast.makeText(context, "Base de datos eliminada con exito", Toast.LENGTH_SHORT);
			tInfo.show();
		}
	
	}
	
	public String descargarDatos(ProgressDialog dlgProgress)
	{
		String linea="";
	//Sacamos la fecha actual para ponerla como nombre de archivo:
		Calendar calendar = new GregorianCalendar();
		try
		{
			Modulebase.ultimoArchivoSended = "datos_"+calendar.get(Calendar.DAY_OF_MONTH)+"_"+calendar.get(Calendar.MONTH)+"_"+calendar.get(Calendar.YEAR)+"_"+calendar.get(Calendar.HOUR)+"_"+calendar.get(Calendar.MINUTE)+"_"+calendar.get(Calendar.SECOND)+".txt";
		File f = new File(Environment.getExternalStorageDirectory().getPath()+"/preventa/"+Modulebase.ultimoArchivoSended);
		if (!f.exists()) {
		     f.getParentFile().mkdirs();
		     f.createNewFile();
		}
			PrintWriter writer = new PrintWriter(f);
			
			//Tabla cobros:
			Cursor c = ejecutarSelect(new String[]{"*"}, "COBROS", null, null);
	        if(c!=null && c.moveToFirst())
	        {
	        	do
	        	{
	        	linea+=c.getString(0)+"\t"+c.getString(1)+"\t"+c.getString(2)+"\t"+c.getString(3)+"\t"+c.getString(4)+"\t"+c.getString(5)+"\t"+c.getString(6)+"\t"+c.getString(7)+"\t"+c.getString(8)+"\t"+c.getString(9)+"\t"+c.getString(10)+"\t"+c.getString(11)+"\t"+c.getString(12)+"\t"+c.getString(13)+"\t"+c.getString(14)+"\r\n";
	        	}while(c.moveToNext());
	        }
	                // Cab_pedido
	        c = ejecutarSelect(new String[]{"N_PEDIDO","VENTA_A_N_CLIE","FECHA_REG","SU_NTRA_REF","VENDEDOR","RUTA","FECHA_ENTREGA","DEVOLUCION"}, "CAB_PEDIDO", null, null);
	        
	        if(c!=null && c.moveToFirst())
	        {
	        	String especial;
	        	
	        	do
	        	{
	        		if(c.getString(7).equals("0"))
		        	{
		        		especial = "No";
		        	}
		        	else
		        	{
		        		especial = "S";
		        	}
	        	linea+="\t"+c.getString(0)+"\t"+c.getString(1)+"\t\t"+c.getString(2)+"\t\t"+c.getString(3)+"\t"+c.getString(4)+"\t"+c.getString(5)+"\t"+c.getString(6)+"\t"+especial+"\t\t\t\r\n";
	        	}while(c.moveToNext());
	        }

	        // N_Serie_Pedido
	/*        c = ejecutarSelect(new String[]{"*"}, "N_SERIE_PEDIDO", null, null);
	        
	        if(c!=null && c.moveToFirst())
	        {
	        	do
	        	{
	        	linea+=c.getString(0)+"\t"+c.getString(1)+"\t"+c.getString(2)+"\t"+c.getString(3)+"\t"+c.getString(4)+"\r\n";
	        	}while(c.moveToNext());
	        }
	  */      
	        linea+="\r\n";
	        // Lin_Pedido
	        c = ejecutarSelect(new String[]{"N_PEDIDO","N_LINEA","COD_PRODUCTO","UD_MEDIDA","CANTIDAD","GRP_REG_IVA_NEG","GRP_REG_IVA_PRD","PRECIO","IMPORTE_LINEA","CANT_UD_MEDIDA","DESCRIPCION","DESCRIPCION2","FECHA_PEDIDO","IMPORTE_IVA","IMPORTE_RE","PRECIO_EN_KG","KG_UNIDAD","PRECIO_VTA_UDKG","DTO_LINEA","PRECIO_NETO_UDKG","PORC_DTO_OFERTA","IMP_FIJO_DTO_OFERTA","PORC_DTO_PROMO","IMP_FIJO_DTO_PROMO","DTO_PRECIO_NETO_UDKG","DTO_FINAL","IMP_DTO_FACTURA"}, "Lin_Pedido", null, null);
	        
	        if(c!=null && c.moveToFirst())
	        {
	        	String pEnKg;
	        	do
	        	{
	        		if(c.getString(15).equals("0"))
		        	{
		        		pEnKg = "No";
		        	}
		        	else
		        	{
		        		pEnKg = "S";
		        	}
	        	linea+="\t"+c.getString(0)+"\t"+c.getString(1)+"\t"+c.getString(2)+"\t"+c.getString(3)+"\t"+c.getString(4)+"\t"+c.getString(5)+"\t"+c.getString(6)+"\t"+c.getString(7)+"\t"+c.getString(8)+"\t"+c.getString(9)+"\t"+c.getString(10)+"\t"+c.getString(11)+"\t"+c.getString(12)+"\t"+c.getString(13)+"\t"+c.getString(14)+"\t\t\t"+pEnKg+"\t"+c.getString(16)+"\t"+c.getString(17)+"\t"+c.getString(18)+"\t"+c.getString(19)+"\t"+c.getString(20)+"\t"+c.getString(21)+"\t"+c.getString(22)+"\t"+c.getString(23)+"\t"+c.getString(24)+"\t"+c.getString(25)+"\t"+c.getString(26)+"\r\n";
	        	}while(c.moveToNext());
	        }
	        
	        linea+="\r\n";
	        // Comentario
	        c = ejecutarSelect(new String[]{"TIPO","FECHA","NUM_LIN","REFERENCIA","COMENTARIO"}, "Comentario", null, null);
	        
	        if(c!=null && c.moveToFirst())
	        {
	        	do
	        	{
	        	linea+="\t"+c.getString(0)+"\t"+c.getString(1)+"\t"+c.getString(2)+"\t"+c.getString(3)+"\t"+c.getString(4)+"\t\t\r\n";
	        	}while(c.moveToNext());
	        }
	        
	        // visitas
	        c = ejecutarSelect(new String[]{"COD_CLIE","FECHA","AUSENTE","COMENTARIO"}, "Visitas", null, null);
	        
	        if(c!=null && c.moveToFirst())
	        {
	        	do
	        	{
	        		String ausente;
	        		if(c.getString(2).equals("0"))
		        	{
		        		ausente = "No";
		        	}
		        	else
		        	{
		        		ausente = "S";
		        	}
	        	linea+="\t"+c.getString(0)+"\t"+c.getString(1)+"\t"+ausente+"\t"+c.getString(3)+"\r\n";
	         	}while(c.moveToNext());
	        }
	        writer.write(linea);
		writer.close();
		//Vamos sacando datos a traves de consultas y escribiendo el fichero con el resultado:
		
		}
		catch(Exception ex)
		{
			return "Error al crear el archivo de exportación de datos.";
		}
		
		return "Datos exportados correctamente";

	}
}